package com.empsys.aspect;

import com.alibaba.fastjson.JSON;
import com.empsys.mapper.RunLogMapper;
import com.empsys.pojo.RunLog;
import com.empsys.utils.JwtUtils;
import io.jsonwebtoken.Claims;
import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.Signature;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.reflect.MethodSignature;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import javax.servlet.http.HttpServletRequest;
import java.time.LocalDateTime;
import java.util.Arrays;

/**
 * @author wzm
 * @create 2023-12-18 10:44
 * project_name:web2310
 * @Description
 */
//日志切面类用于增强 增删改日志
@Aspect
@Component
@Slf4j
public class LogAspect {
    //ioc容器中各个对象是存在的 可以直接使用  当然在controller的方法中直接使用起始也是用的自动装配
    @Autowired
    HttpServletRequest httpServletRequest;

    @Autowired
    private RunLogMapper runLogMapper;

    //环绕通知
    @Around("@annotation(com.empsys.anno.Log)")
    public Object around(ProceedingJoinPoint pjp) throws Throwable {

        //操作人  登录以后数据里的token中 每次会通过请求头携带
        String token = httpServletRequest.getHeader("Token");
            //获取登录人员id
        Integer uid = (Integer)JwtUtils.parseJwt(token).get("id"); //获取id属性

        //操作时间
        LocalDateTime now = LocalDateTime.now();

        //操作类名
        String className = pjp.getTarget().getClass().getName();

        //操作方法
        String methodName = pjp.getSignature().getName();


        //操作方法参数
        Object[] args = pjp.getArgs();
            //转字符串
        String methodParams = Arrays.toString(args);

        //计算开始
        long begin = System.currentTimeMillis();

        //执行原始方法
        Object result = pjp.proceed();

        //方法的返回值
        String returnValue = JSON.toJSONString(result);

        //计算结束
        long end = System.currentTimeMillis();

        //操作耗时
        long time = end - begin;

        //添加到数据库
        //创建日志对象
        RunLog runLog = new RunLog(null,uid,now,className,methodName,methodParams,returnValue,time);
        log.info("日志新增对象{}",runLog );
        runLogMapper.insert(runLog);

        return result;
    }

}
